﻿using Currency.Infra.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Currency.Infra.Repository.Entities.Config
{
    /// <summary>
    /// 通用默认映射关系
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public abstract class EntityTypeConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : Entity
    {
        public virtual void Configure(EntityTypeBuilder<TEntity> builder)
        {
            var entityType = typeof(TEntity);

            builder.HasKey(x => x.Id);//设置构成此实体类型的主键的属性
            builder.Property(x => x.Id).ValueGeneratedNever();//在保存此实体类型的实例时，将属性配置为从不具有数据库生成的值。

            if (typeof(SoftDelete).IsAssignableFrom(entityType))
            {
                builder.Property("IsDeleted").HasDefaultValue(false);//列的默认值。
                builder.HasQueryFilter(d => EF.Property<bool>(d, "IsDeleted") == false);//指定将自动应用于针对此实体类型的任何查询的 LINQ 谓词表达式。
            }
        }
    }
}
